package com.kdg.juc;

/**
 * Created by Kong on 2017/7/21.
 *
 * volatile:保证多个线程数据共享时数据的一致性，可以保证数据在内存中的可见
 *          相较于synchronized是一种轻量级的同步策略
 * tips:
 *     1.volatile 不具备互斥性（即多个锁访问共享数据时synchronized只能单个进行访问，而使用volatile都可以访问共享数据，只不过是在主存中）
 *     2.volatile 不能保证变量的原子性（只是轻量级表示内存可见性）
 * */
public class TestVolitile {


    public static void main(String[] args){
        ThreadDemo td = new ThreadDemo();
        new Thread(td).start();

        while(true){
            if(td.isFlag()){
                System.out.println("testVolitile is " + td.isFlag());
                break;
            }
        }
        /*while(true){
            //当数据共享时同步锁会去内存中去刷新
            synchronized (td){
                if(td.isFlag()){
                    System.out.println("testVolitile is " + td.isFlag());
                    break;
                }
            }
        }*/
    }
}

class ThreadDemo implements Runnable{

    private boolean flag = false;

    @Override
    public void run() {

        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        flag = true;
        System.out.println("flag is " + isFlag());
    }


    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }
}
